

window.jsonTables = window.jsonTables || {};
jsonTables.extFlag =  "ext";
//初始化配置表数据，在resources/config.json里面
jsonTables.initTableConfig = function (data) {
    for (var variable in data) {
        if (data.hasOwnProperty(variable)) {
            jsonTables[variable] = data[variable];
            console.log("初始化表格："+variable);
        }
    }
};

/** 根据tid 执行map存储 */
jsonTables._initTable = function (value) {
    if(Array.isArray(jsonTables[value]))
    {
        for (var i = 0 , len = jsonTables[value].length; i < len; i++) {
            var obj = jsonTables[value][i];
            // console.log("_initTable obj:"+JSON.stringify(obj));
            if (obj.Tid) {
                // console.log("_initTable:" + value+jsonTables.extFlag);
                jsonTables[value+jsonTables.extFlag] = jsonTables[value+jsonTables.extFlag] || {};
                jsonTables[value+jsonTables.extFlag][obj.Tid] = obj;
            }
        }
    }
    else
    {
        jsonTables[value+jsonTables.extFlag] = jsonTables[value+jsonTables.extFlag] || {};
        jsonTables[value+jsonTables.extFlag][jsonTables[value].Tid] = jsonTables[value];
    }
};

jsonTables.getJsonTable = function (tableName) {
    return jsonTables[tableName];
};
jsonTables.getJsonTableSize = function (tableName) {   
    if (!jsonTables[tableName + jsonTables.extFlag]) {
        this._initTable(tableName);//第一次进行数据重组
    }
    return Object.keys(jsonTables[tableName+jsonTables.extFlag]).length;
};
/**
* 获取表内元素
* @param  {string} tableName 表名
* @param  {int} tableId   tid
* @param  {int} ext   扩展索引 根据不同表用的数值不同
*/
jsonTables.getJsonTableObj = function (tableName, tableId, ext,showErr=true) {
    var obj = null;
    if (!jsonTables[tableName + jsonTables.extFlag]) {
        this._initTable(tableName);//第一次进行数据重组
    }
    // console.log("getJsonTableObj:" + tableName);
    // console.log("getJsonTableObj:" + JSON.stringify(jsonTables[tableName + jsonTables.extFlag]));
    if (jsonTables[tableName+jsonTables.extFlag] && jsonTables[tableName+jsonTables.extFlag][tableId]) {
        if (ext !== undefined && ext !== null && jsonTables[tableName+jsonTables.extFlag][tableId][ext]) {
            obj = jsonTables[tableName+jsonTables.extFlag][tableId][ext];
            // console.log("obj:"+obj);
        }else {
            obj = jsonTables[tableName+jsonTables.extFlag][tableId];
            // console.log("obj:"+obj);
        }
    }
    if (!obj) {
        var table = this.getJsonTable(tableName);
        if(table){
            for(var i = 0; i < table.length; i++) {
                if(table[i].Tid !== tableId) continue;
                obj = table[i];
                break;
            }
        }
    }
    if (showErr && !obj && tableName !== jsonTables.TABLE.HEAD &&  tableName !== jsonTables.TABLE.STORY) {
        var str = "配置表数据未找到！！"+"表名->"+tableName+",Tid->"+tableId;
        str = ext !== undefined && ext !== null ? str +",Lv->"+ext : str;
        cc.error(str);
    }
    return obj;
};
/**
* 获取表内几个元素
* @param  {string} tableName 表名
* @param  {int} tableId   字段名
* @param  {int} value   字段名的值
*/
jsonTables.getJsonTableArrObj = function (tableName, tableId, value) {
    var obj = [];
    if (!jsonTables[tableName + jsonTables.extFlag]) {
        this._initTable(tableName);//第一次进行数据重组
    }
    let len = jsonTables.getJsonTableSize(tableName);
    for(let i = 1; i <= len; i++)
    {
        if (jsonTables[tableName+jsonTables.extFlag] && jsonTables[tableName+jsonTables.extFlag][i]) {
            if (value !== undefined && value !== null && jsonTables[tableName+jsonTables.extFlag][i][tableId] && jsonTables[tableName+jsonTables.extFlag][i][tableId] == value) {
                obj.push(jsonTables[tableName+jsonTables.extFlag][i]);
            }
        }
    }
    if (!obj && tableName !== jsonTables.TABLE.HEAD &&  tableName !== jsonTables.TABLE.STORY) {
        var str = "配置表数据未找到！！"+"表名->"+tableName+",Tid->"+tableId;
        str = value !== undefined && value !== null ? str +",Lv->"+value : str;
        cc.error(str);
    }
    
    return obj;
};

/**
* 随机数组中的某个obj
*/
jsonTables.randomArrObj = function(arr){
    return arr[jsonTables.randomIntegerN2M(0,arr.length - 1)];
};

jsonTables.dealName = function (name) {
    var len = 0;
    var str = "";
    for (var i = 0; i < name.length; i++) {
        var length = name.charCodeAt(i);
        if(length>=0&&length<=128){
            len += 1;
        }else{
            len += 2;
        }
        str += name[i];
        if(len >= 10 && i < name.length - 1){
            str += "...";
            break;
        }
    }
    return str;
};

/**
* 随机数组中的某几个obj
*/
jsonTables.randomArrCountObj = function(arr, count) {
    if(count === 0) return [];
    if(count >= arr.length) return arr;
    var shuffled = arr.slice(0), i = arr.length, min = i - count, temp, index;
    while (i-- > min) {
        index = Math.floor((i + 1) * Math.random());
        temp = shuffled[index];
        shuffled[index] = shuffled[i];
        shuffled[i] = temp;
    }
    return shuffled.slice(min);
};

/**
* 随机数组中的某几个obj
*/
jsonTables.randomArrCountObjEx = function(arr, count , inArr) {
    if(count === 0) return [];
    if(count >= arr.length) return arr;
    if(inArr && inArr.length >= count)  return inArr;
    var getArr = inArr ? inArr : [];
    while (getArr.length < count) {
        var index = Math.floor((arr.length - 1) * Math.random());
        if(arr[index]){
            if(getArr.indexOf(arr[index]) === -1){
                getArr.push(arr[index]);
            }
        }
    }
    return getArr;
};


jsonTables.randomIntegerN2M = function (n, m) {
    var random = Math.floor(Math.random() * (m - n + 1) + n);
    return random;
};

/** 是一个数据随机排序 */
jsonTables.randonByRand = function (arr) {
    if (arr instanceof Array) {
        return arr.sort(function () {
            return Math.random() - 0.5;
        });
    }
    return arr;
};

jsonTables.randomSoleInteger= function (scopeArr) {
    var count = scopeArr.length;
    var scopeArr = cc.js.array.copy(scopeArr);
    let questions = [];
    for (let i = 0; i < count; i++) {
        let random = Math.floor(Math.random() * scopeArr.length);
        questions.push(scopeArr[random])
        scopeArr.splice(random, 1)
    }
    return questions;
};

jsonTables.probabilityCanHappen= function (num){
    let random = jsonTables.randomIntegerN2M(0,100);
    return random<=num;
};

//传入若干概率值，返回中标的概率
jsonTables.probability = function(){
    var arr = 0;
    var pres = arguments[0];
    var probabilityCount = 0;
    for (let i = 0; i < pres.length; i++){
        probabilityCount+=pres[i];
    }
    var nums = new Array();
    for (let i = 0; i < pres.length; i++) {
        const element = pres[i];
        for (let index = 0; index < element; index++) {
            nums.push(arr);
        }
        arr++;
    }
    var random = jsonTables.randomIntegerN2M(0,probabilityCount - 1);
    var targetNum = nums[random];
    return targetNum;
};

jsonTables.getTimeStr = function (time) {
    var min = Math.floor(time / 60);
    var second = Math.floor(time - min * 60);
    var str = "";
    if(min){
        str = min + "分" + second + "秒";
    }else{
        str = second + "秒";
    }
    return str;
};

jsonTables.getRandomName = function () {
    var config = this.getJsonTable(jsonTables.TABLE.NAME);
    var nameConfig1 = jsonTables.randomArrObj(config);
    var nameConfig2 = jsonTables.randomArrObj(config);
    return nameConfig1.zhPre + nameConfig2.zhName + jsonTables.randomIntegerN2M(10,99);
};

jsonTables.dealName = function (name) {
    var len = 0;
    var str = "";
    for (var i = 0; i < name.length; i++) {
        var length = name.charCodeAt(i);
        if(length>=0&&length<=128){
            len += 1;
        }else{
            len += 2;
        }
        str += name[i];
        if(len >= 12 && i < name.length - 1){
            str += "...";
            break;
        }
    }
    return str;
};

jsonTables.getGameBaseValue = function (key) {
    return jsonTables[jsonTables.TABLE.GAMEBASE][key]
};

jsonTables.getRankConfig = function (score) {
    var config = jsonTables.getJsonTable(jsonTables.TABLE.SEGMENT);
    for (var i = 1 , len = config.length; i < len; i++) {
        var obj = config[i];
        if(obj.point > score){
            break;
        }
    }
    return config[ i - 1 ];
};

jsonTables.getRankName = function (score) {
    var config = jsonTables.getJsonTable(jsonTables.TABLE.SEGMENT);
    for (var i = 1 , len = config.length; i < len; i++) {
        var obj = config[i];
        if(obj.point > score){
            break;
        }
    }
    return config[ i - 1 ].name;
};
//获得一个我目前分段的题目
jsonTables.getRankChapter = function (score) {
    var config = jsonTables.getJsonTable(jsonTables.TABLE.SEGMENT);
    for (var i = 1 , len = config.length; i < len; i++) {
        var obj = config[i];
        if(obj.point > score){
            break;
        }
    }
    var configRank;
    var range = config[ i - 1 ].range;
    while (!configRank) {
        var tid = jsonTables.randomIntegerN2M(range[0],range[1]);
        var data = jsonTables.getJsonTableObj(jsonTables.TABLE.CHAPTER,tid);
        if(data){
            configRank = data;
        }else{
            cc.error(tid + "关卡找不到啊")
        }
    }
    return configRank;
};

jsonTables.isJsonString = function (str) {
    try {
      if (typeof JSON.parse(str) === "object") {
        console.log("收到object");
        return true;
      }
    } catch (e) {
      console.log(e);
    }
    return false;
};

jsonTables.getAge = function (sec) {
    var min = Math.floor(sec / 60);
    var age = Math.floor(2.91 * Math.pow(min,0.5223));
    return age;
};

jsonTables.getOffset = function (offset) {
    return this.getLog(30,Math.pow(offset + 1, 0.9)) * 85 + 1.2 * offset + 20 * this.getLog(35+offset,offset);
};

jsonTables.getLog = function (x,y) {
    return Math.log(y) / Math.log(x);
};

/**
 * 刷新视图
 */
jsonTables.refreshView = function (data,parent,itemPrefab,initCallback) {
    let children = parent.children;
    for(let i = 0;i < data.length;++i){
        let placeItem;
        if(i >= children.length){
            placeItem = cc.instantiate(itemPrefab);
            if(!placeItem)  return;
            placeItem.parent = parent;
        }
        placeItem = children[i];
        if(placeItem.getComponent(itemPrefab.name)){
            placeItem.getComponent(itemPrefab.name).init(i,data[i]);
        }
        if(initCallback){//初始化回调
            initCallback(i,placeItem);
        }
    }
    while (children.length > data.length){
        children[children.length - 1].destroy();
        children[children.length - 1].removeFromParent();
    }
};
